package es.gesfutbol.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

import es.gesfutbol.domini.implementacio.Equip;
import es.gesfutbol.domini.implementacio.EquipEnLliga;
import es.gesfutbol.domini.implementacio.IdEquipEnLliga;
import es.gesfutbol.domini.implementacio.JugadorEnEquip;
import es.gesfutbol.domini.implementacio.Lliga;
import es.gesfutbol.util.HibernateDao;
import es.gesfutbol.util.HibernateHelper;

public class EquipEnLligaDao extends HibernateDao<EquipEnLliga, IdEquipEnLliga> implements IEquipEnLligaDao{

	@Transactional(readOnly = false)
	public void saveOrUpdate(EquipEnLliga equipEnLliga) {
		this.getSessionFactory().getCurrentSession().saveOrUpdate(equipEnLliga);		
	}
	
	
	@SuppressWarnings("unchecked")
	@Transactional(readOnly = true)
	public List<EquipEnLliga> findByIdLligaDeproxy(Long idLliga) {
		
		List<EquipEnLliga> equipEnLliga =  this.getSessionFactory().getCurrentSession().createCriteria(EquipEnLliga.class)
			.add(Restrictions.eq("id.lliga.idLliga", idLliga)).list();
		
		List<EquipEnLliga> equipEnLligaDeproxy = null;
		
		if(equipEnLliga!=null && equipEnLliga.size()>0){
			equipEnLligaDeproxy = new ArrayList<EquipEnLliga>();
			for(EquipEnLliga j : equipEnLliga){
				equipEnLligaDeproxy.add(deproxy(j));
			}
		}
		return equipEnLligaDeproxy;
	}
	
	@Override
	@Transactional(readOnly = true)
	public EquipEnLliga deproxy(EquipEnLliga equipEnLliga) {
		
		//Deproxy de la lliga.
		Lliga lliga = equipEnLliga.getId().getLliga();
		Hibernate.initialize(lliga);
		lliga = HibernateHelper.deproxy(lliga, Lliga.class);
		equipEnLliga.getId().setLliga(lliga);
		
		//Deproxy del Equip.
		Equip equip = equipEnLliga.getId().getEquip();
		Hibernate.initialize(equip);
		equip = HibernateHelper.deproxy(equip, Equip.class);
		equipEnLliga.getId().setEquip(equip);
		
		return equipEnLliga;
	}
	
	@Override
	@Transactional(readOnly = true)
	public EquipEnLliga findEquipEnLligaByEquipILliga(Long idEquip,Long idLliga) {
		return (EquipEnLliga) this.getSessionFactory().getCurrentSession().createCriteria(EquipEnLliga.class)
		.add(Restrictions.eq("id.equip.idEquip", idEquip))
		.add(Restrictions.eq("id.lliga.idLliga", idLliga))
		.uniqueResult();
	}
	
	@Transactional(readOnly = true)
	public EquipEnLliga findEquipEnLligaByEquipILligaDeproxy(Long idEquip,Long idLliga) {
		EquipEnLliga equipEnLliga = (EquipEnLliga) this.getSessionFactory().getCurrentSession().createCriteria(EquipEnLliga.class)
				.add(Restrictions.eq("id.equip.idEquip", idEquip))
				.add(Restrictions.eq("id.lliga.idLliga", idLliga))
				.uniqueResult();
		return deproxy(equipEnLliga);
	}
	
	@Override
	@Transactional(readOnly = true)
	public EquipEnLliga resetEstadistica(EquipEnLliga equipEnLliga) {
		
		equipEnLliga.setGolsAFavorTotals(0);
		equipEnLliga.setGolsEnContraTotals(0);
		equipEnLliga.setPartitsEmpatatsTotals(0);
		equipEnLliga.setPartitsGuanyatsTotals(0);
		equipEnLliga.setPartitsJugatsTotals(0);
		equipEnLliga.setPartitsPerdutsTotals(0);
		equipEnLliga.setPuntuacio(0);
		
		return equipEnLliga;
	}
	
//	@Override
//	@Transactional(readOnly = true)
//	public EquipEnLliga findEquipEnLligaByEquipITemporada(Long idEquip,	String temporada) {
//		return (EquipEnLliga) this.getSessionFactory().getCurrentSession().createCriteria(EquipEnLliga.class)
//		.add(Restrictions.eq("id.equip.idEquip", idEquip))
//		.add(Restrictions.eq("id.lliga.temporada", temporada))
//		.uniqueResult();
//	}
}
